package com.etongwl.testmode;

import android.content.res.ColorStateList;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.SubscriptSpan;
import android.text.style.SuperscriptSpan;
import android.text.style.TextAppearanceSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 文本显示
 * Created by jason on 16/3/22.
 */
public class TextChangeUtil {


    /**
     * 文字改变
     *
     * @param res
     *            资源的文字
     * @param key
     *            需要改变的文字
     * @return 改变后的字符串
     */
    public static String changeText(String res, String key) {
        return String.format(res, key);
    }

    /**
     * 改变文本指定文字的颜色
     *
     * @param res
     *            指定文本
     * @param key
     *            指定改变的文字
     * @param color
     *            指定改变文字的颜色
     * @return 改变后的文本
     */
    public static SpannableString changeKeyColorForString(String res, String key, int color) {
        return change(res, key, new ForegroundColorSpan(color));
    }


    /**
     * 改变文本指定文字的颜色
     *
     * @param res
     *            指定文本
     * @param key
     *            指定改变的文字
     * @param color
     *            指定改变文字的颜色
     * @return 改变后的文本
     */
    public static SpannableString changeKeyColorForString(SpannableString res, String key, int color) {
        return change(res, key, new ForegroundColorSpan(color));
    }

    /**
     * 改变文本指定文字的大小，相对于这段文本的文字大小做改变
     *
     * @param res
     *            指定的文本
     * @param key
     *            指定的关键字
     * @param Rate
     *            放大的比例
     * @return 改变后的文本
     */
    public static SpannableString changeKeySizeForRelative(String res,
                                                           String key, float Rate) {
        return change(res, key, new RelativeSizeSpan(Rate));
    }


    /**
     * 改变文本指定文字的大小，相对于这段文本的文字大小做改变
     *
     * @param res
     *            指定的文本
     * @param key
     *            指定的关键字
     * @param Rate
     *            放大的比例
     * @return 改变后的文本
     */
    public static SpannableString changeKeySizeForRelative(SpannableString res,
                                                           String key, float Rate) {
        return change(res, key, new RelativeSizeSpan(Rate));
    }

    /**
     * 改变文本指定文字的大小，设置想显示的大小，
     * <P>
     * eg: size=12sp 那么显示的指定文字大小就为12sp
     * </p>
     *
     * @param res
     *            指定的文本
     * @param key
     *            指定的关键字
     * @param size
     *            指定文字的大小
     * @return 返回改变后的文本
     */
    public static SpannableString changeKeySizeForAbsolute(String res,
                                                           String key, int size) {
        return change(res, key, new AbsoluteSizeSpan(size));
    }

    /**
     * 改变文本指定关键字的背景色
     *
     * @param res
     *            指定的文本
     * @param key
     *            指定的关键字
     * @param color
     *            指定文字的背景色
     * @return 返回改变后的文本
     */
    public static SpannableString changeKeyBgColorForString(String res,
                                                            String key, int color) {
        return change(res, key, new BackgroundColorSpan(color));
    }

    /**
     * 改变文本指定关键字的样式
     *
     * @param res
     *            指定的文本
     * @param key
     *            指定的关键字
     * @param style
     *            指定关键字的样式
     * @return 返回改变后的文本
     */
    public static SpannableString changeKeyStyleForString(String res,
                                                          String key, int style) {
        return change(res, key, new StyleSpan(style));
    }

    /**
     * 给文本指定的关键字设置下划线
     *
     * @param res
     *            指定的文本
     * @param key
     *            指定的关键字
     * @return 返回改变后的文本
     */
    public static SpannableString keySetUnderlineForStirng(String res,
                                                           String key) {
        return change(res, key, new UnderlineSpan());
    }

    /**
     * 给文本指定关键字设置删除线
     *
     * @param res
     *            指定的文本
     * @param key
     *            指定的关键字
     * @return 返回改变后的文本
     */
    public static SpannableString keySetDelLineForString(String res, String key) {
        return change(res, key, new StrikethroughSpan());
    }

    /**
     * 给文本指定的文字设置下标
     *
     * @param res
     *            指定的文本
     * @param key
     *            指定的关键字
     * @return 返回改变的文本
     */
    public static SpannableString keySetSubForString(String res, String key) {
        return change(res, key, new SubscriptSpan());
    }

    /**
     * 给文本指定的文字设置上标
     *
     * @param res
     *            指定的文本
     * @param key
     *            指定的关键字
     * @return 返回改变的文本
     */
    public static SpannableString keySetSupForString(String res, String key) {
        return change(res, key, new SuperscriptSpan());
    }

    /**
     * 给文本的指定文字设置超链接
     *
     * @param res
     *            指定的文本
     * @param key
     *            指定的关键字
     * @param htmlAdd
     *            超链接地址
     *            <p/>
     *            1, 打电话 tel:123456789
     *            <p/>
     *            2, 发邮件 mailto:webmaster@google.com
     *            <p/>
     *            3, 网页 http://www.baidu.com
     *            <p/>
     *            4, 发短信 sms:4155551212
     *            <p/>
     *            5, 发彩信 mms:4155551212
     *            <p/>
     *            6, 地图 geo:38.899533,-77.036476
     * @return
     */
    public static SpannableString keySetHtmlForString(String res, String key,
                                                      String htmlAdd) {
        return change(res, key, new URLSpan(htmlAdd));
    }

    /**
     * 改变文本指定文字的所有属性
     * @param res 正定文本
     * @param key 指定文字
     * @param family 设置超链接
     * @param style 设置字体样式
     * @param size 设置字体大小
     * @param color 设置字体颜色
     * @param linkColor 设置链接颜色
     * @return 返回改变后的文本
     */
    public static SpannableString keySetAllAttForString(String res, String key,
                                                        String family, int style, int size, ColorStateList color, ColorStateList linkColor){
        return change(res, key, new TextAppearanceSpan(family, style, size, color, linkColor));
    }

    /**
     * 改变的核心代码
     *
     * @param res
     *            指定文本
     * @param key
     *            指定的关键字
     * @param obj
     *            指定改变的类型
     * @return 返回改变的
     */
    private static SpannableString change(String res, String key, Object obj) {
        SpannableString spannableString = new SpannableString(res);
        Pattern pattern = Pattern.compile(key);
        Matcher matcher = pattern.matcher(spannableString);
        while (matcher.find()) {
            int start = matcher.start();
            int end = matcher.end();
            spannableString.setSpan(obj, start, end,
                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        return spannableString;
    }



    /**
     * 改变的核心代码
     *
     * @param res
     *            指定文本
     * @param key
     *            指定的关键字
     * @param obj
     *            指定改变的类型
     * @return 返回改变的
     */
    private static SpannableString change(SpannableString res, String key, Object obj) {
        SpannableString spannableString =res;
        Pattern pattern = Pattern.compile(key);
        Matcher matcher = pattern.matcher(spannableString);
        while (matcher.find()) {
            int start = matcher.start();
            int end = matcher.end();
            spannableString.setSpan(obj, start, end,
                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        return spannableString;
    }

}
